package demo.IOInputOutput;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/8/11-08-11-11:09
 * @Description：demo.IOInputOutput    IO流
 */
/*
四种基本的抽象流
    InPutStream  字节输入流
        int read()
    OutputStream  字节输出流
        void write()
    Reader     字符输入流
    Writer     字符输出流
 */
public class Iolearn {
    public static void main(String[] args) {
        //1、声明流
        //2、创建流对象
        InputStream in = System.in;            //System.in 阻塞流
        OutputStream out = System.out;
        //3、使用流对象进行读写
        try {
            //读写一个字节
//            int value = in.read();      //读一个字节并返回ascII码  -> 字符
//            System.out.println("value: "  + value);
//            out.write(value);

            //读写多个字节
//            byte[]  b = new byte[1024];     //一次可以读取1024bytes
//            int len = in.read(b);       //输入abcd
//            System.out.println(Arrays.toString(b));     //[97,98,99,100,10,0...] 10为换行
//            out.write(b,0,len);

            //一直读一直写
            byte[] b = new byte[1024];
            int len;
            while ((len = in.read(b)) != -1){
                out.write(b,0,len);
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //4、关闭流  物理流，jvm不会自动回收
            //如果不手动关流，造成资源泄露
            //输出流无效，可能认为操作伪结束
            try {
                if(in != null){
                    in.close();
                }
                if(out != null){
                    out.close();     //将值刷新到屏幕
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
